package DevCode.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import DevCode.Excepcion.DAOExcepcion;
import DevCode.Excepcion.LoginExcepcion;
import DevCode.Modelo.Usuario;
import DevCode.Util.ConexionBD;

public class UsuarioDAO extends BaseDAO {
	
	public Usuario validarUsuario(String email, String clave)
			throws DAOExcepcion, LoginExcepcion {
		String query = "select USicodigo, USvnombres, USvapaterno, USvamaterno, USvtipousuario, CentroFormacion_CFicodigo from usuario where USiestado=true and USvcorreo=? and USvpassword=?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Usuario u = new Usuario();
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, email);
			stmt.setString(2, clave);
			rs = stmt.executeQuery();
			if (rs.next()) {
				u.setUSicodigo(rs.getInt("USicodigo"));
				u.setUSvnombres(rs.getString("USvnombres"));
				u.setUSvapaterno(rs.getString("USvapaterno"));
				u.setUSvamaterno(rs.getString("USvamaterno"));
				u.setUSvtipousuario(rs.getString("USvtipousuario"));
				u.setCFicodigo(rs.getInt("CentroFormacion_CFicodigo"));			
			} else {
				throw new LoginExcepcion("No existe");
			}
		} catch (LoginExcepcion e) {
			System.err.println(e.getMessage());
			throw new LoginExcepcion(e.getMessage());
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return u;		
	}
	
	public Collection<Usuario> buscarUsuario(String USvnombres, int CFicodigo, int busqueda)
			throws DAOExcepcion {
		String query;
		if(busqueda == 1){
			query = "select USicodigo, USvnombres, USvapaterno, USvamaterno, UScsexo, USvtipodocumento, USvnumdocumento, USvnumcelular, "
						+"USvcorreo, USvpassword, USvtipousuario, USiestado, CentroFormacion_CFicodigo from usuario "
						+"where USiestado=true and concat(USvnombres, USvapaterno, USvamaterno) like ?";
		}else{
			query = "select USicodigo, USvnombres, USvapaterno, USvamaterno, UScsexo, USvtipodocumento, USvnumdocumento, USvnumcelular, "
						+"USvcorreo, USvpassword, USvtipousuario, USiestado, CentroFormacion_CFicodigo from usuario "
						+"where USiestado=true and concat(USvnombres, USvapaterno, USvamaterno) like ? and CentroFormacion_CFicodigo=?";
		}
		Collection<Usuario> lista = new ArrayList<Usuario>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + USvnombres + "%");
			if(busqueda == 0){
			stmt.setInt(2, CFicodigo);
			}
			rs = stmt.executeQuery();
			while (rs.next()) {
				Usuario u = new Usuario();
				u.setUSicodigo(rs.getInt("USicodigo"));
				u.setUSvnombres(rs.getString("USvnombres"));
				u.setUSvapaterno(rs.getString("USvapaterno"));
				u.setUSvamaterno(rs.getString("USvamaterno"));
				u.setUScsexo(rs.getString("UScsexo"));
				u.setUSvtipodocumento(rs.getString("USvtipodocumento"));
				u.setUSvnumdocumento(rs.getString("USvnumdocumento"));
				u.setUSvnumcelular(rs.getString("USvnumcelular"));
				u.setUSvcorreo(rs.getString("USvcorreo"));
				u.setUSvpassword(rs.getString("USvpassword"));
				u.setUSvtipousuario(rs.getString("USvtipousuario"));
				u.setUSiestado(rs.getBoolean("USiestado"));
				u.setCFicodigo(rs.getInt("CentroFormacion_CFicodigo"));
				lista.add(u);				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public Collection<Usuario> ConsultarUsuario(String USvnumdocumento, String USvcorreo)
			throws DAOExcepcion {
		String query = "Select USicodigo, USvnumdocumento, USvcorreo from usuario where USvnumdocumento=? or USvcorreo=?";
		Collection<Usuario> lista = new ArrayList<Usuario>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, USvnumdocumento);
			stmt.setString(2, USvcorreo);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Usuario u = new Usuario();
				u.setUSicodigo(rs.getInt("USicodigo"));
				u.setUSvnumdocumento(rs.getString("USvnumdocumento"));
				u.setUSvcorreo(rs.getString("USvcorreo"));
				lista.add(u);				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public Usuario obtenerUsuario(int USicodigo) throws DAOExcepcion {
		String query = "select USicodigo, USvnombres, USvapaterno, USvamaterno, UScsexo, USvtipodocumento, USvnumdocumento, "
				+ "USvnumcelular, USvcorreo, USvpassword, USvtipousuario, USiestado, CentroFormacion_CFicodigo from usuario "
				+ "where USicodigo=?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Usuario u = new Usuario();
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, USicodigo);
			rs = stmt.executeQuery();
			if (rs.next()) {
				u.setUSicodigo(rs.getInt("USicodigo"));
				u.setUSvnombres(rs.getString("USvnombres"));
				u.setUSvapaterno(rs.getString("USvapaterno"));
				u.setUSvamaterno(rs.getString("USvamaterno"));
				u.setUScsexo(rs.getString("UScsexo"));
				u.setUSvtipodocumento(rs.getString("USvtipodocumento"));
				u.setUSvnumdocumento(rs.getString("USvnumdocumento"));
				u.setUSvnumcelular(rs.getString("USvnumcelular"));
				u.setUSvcorreo(rs.getString("USvcorreo"));
				u.setUSvpassword(rs.getString("USvpassword"));
				u.setUSvtipousuario(rs.getString("USvtipousuario"));
				u.setUSiestado(rs.getBoolean("USiestado"));
				u.setCFicodigo(rs.getInt("CentroFormacion_CFicodigo"));	
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return u;
	}
	
	public Usuario guardarUsuario(Usuario u, int ope) throws DAOExcepcion {
		String query="";
		if (ope == 1){
			query = "insert into usuario (`USvnombres`,`USvapaterno`,`USvamaterno`,`UScsexo`,`USvtipodocumento`,`USvnumdocumento`,`USvnumcelular`,"
					+ "`USvcorreo`,`USvpassword`,`USvtipousuario`,`USiestado`,`CentroFormacion_CFicodigo`) values (?,?,?,?,?,?,?,?,?,?,?,?)";
		}else{
			query = "update usuario set USvnombres=?, USvapaterno=?, USvamaterno=?, UScsexo=?, USvtipodocumento=?, USvnumdocumento=?, USvnumcelular=?, "
					+ "USvcorreo=?, USvpassword=?, USvtipousuario=?, USiestado=?, CentroFormacion_CFicodigo=? where USicodigo=?";
		}
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, u.getUSvnombres());
			stmt.setString(2, u.getUSvapaterno());
			stmt.setString(3, u.getUSvamaterno());
			stmt.setString(4, u.getUScsexo());
			stmt.setString(5, u.getUSvtipodocumento());
			stmt.setString(6, u.getUSvnumdocumento());
			stmt.setString(7, u.getUSvnumcelular());
			stmt.setString(8, u.getUSvcorreo());
			stmt.setString(9, u.getUSvpassword());
			stmt.setString(10, u.getUSvtipousuario());
			stmt.setBoolean(11, u.getUSiestado());
			stmt.setInt(12, u.getCFicodigo());
			if (ope != 1){
				stmt.setInt(13, u.getUSicodigo());
			}
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar / atualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}				
		return u;
	}
	
	public void eliminarUsuario(int USicodigo) throws DAOExcepcion {	
		String query = "update usuario set USiestado=false where USicodigo=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, USicodigo);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo desactivar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

}